package controllers;

import java.util.ArrayList;
import java.util.List;
import models.Acabado;
import models.Material;
import models.MaterialImprimible;
import models.MaterialLaminado;
import models.MaterialMontaje;
import models.PosicionIVA;
import models.TipoMaterial;
import datatransfer.MaterialDTO;
import play.mvc.*; 
import org.modelmapper.ModelMapper;

public class Materiales extends Controller {

	public static void index() {
		List<MaterialDTO> materialesDTO=getMaterialesDTO();
		render(materialesDTO);
	}

	public static void list() {
		List<MaterialDTO> materialesDTO=getMaterialesDTO();
		render(materialesDTO);
	}
	
	public static void show(long id) {
		Material material = Material.findById(id);
		List<Acabado> acabados = Acabado.findAll();
		MaterialDTO materialDTO = convert(material);
		render("@form", materialDTO, acabados);
	}

	public static void form() {
		List<Acabado> acabados = Acabado.findAll();
		render(acabados);
	}

	public static void save(MaterialDTO materialDTO) {
		ModelMapper modelMapper = new ModelMapper();
		Material material;
		Acabado acabado=null;

		if (materialDTO.id != null) {
			material = Material.findById(materialDTO.id);
			material.deleted = true;
			material.save();
			materialDTO.id=null;
		}
		
		if(!materialDTO.tipo.equals(TipoMaterial.MONTAJE.getValue()))
			acabado= Acabado.findById(materialDTO.acabadoId);
		
		if (materialDTO.tipo.equals(TipoMaterial.IMPRIMIBLE.getValue())){
			material = modelMapper.map(materialDTO, MaterialImprimible.class);
			((MaterialImprimible)material).acabado=acabado;
		}
		else if (materialDTO.tipo.equals(TipoMaterial.LAMINADO.getValue())){
			material = modelMapper.map(materialDTO, MaterialLaminado.class);
			((MaterialLaminado)material).acabado=acabado;
		}
		else
			material = modelMapper.map(materialDTO, MaterialMontaje.class);
		
		material.save();
		list();
	}
	
	public static void delete(long id) {
		Material material = Material.findById(id);
		material.deleted = true;
		material.save();
		list();
	}
	
	private static List<MaterialDTO> getMaterialesDTO(){
		List<Material> materiales = Material.find("deleted=?", false).fetch();
		List<MaterialDTO> materialesDTO=new ArrayList<MaterialDTO>();
		for(Material m :materiales)
			materialesDTO.add(convert(m));
		return materialesDTO;
	}
	
	private static MaterialDTO convert(Material material){
		ModelMapper modelMapper = new ModelMapper();
		MaterialDTO materialDTO = modelMapper.map(material, MaterialDTO.class);
		if (material instanceof MaterialImprimible)
			materialDTO.tipo=TipoMaterial.IMPRIMIBLE.getValue();
		else if (material instanceof MaterialLaminado)
			materialDTO.tipo=TipoMaterial.LAMINADO.getValue();
		else 
			materialDTO.tipo=TipoMaterial.MONTAJE.getValue();
		return materialDTO;
	}
}
